{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 代数\n",
    "\n",
    "## 引言\n",
    "\n",
    "SymPy 的代数模块支持四元数的基本代数运算。\n",
    "\n",
    "## 四元数基准\n",
    "\n",
    "本节列出了由代数模块实现的类。\n",
    "\n",
    "### 类 sympy.algebras.Quaternion(a=0, b=0, c=0, d=0, real_field=True)\n",
    "\n",
    "提供基本的四元数运算。四元数对象可以实例化为 Quaternion (a，b，c，d) ，如下所示(a + b * i + c * j + d * k)。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 1 + 2 i + 3 j + 4 k$"
      ],
      "text/plain": [
       "1 + 2*i + 3*j + 4*k"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy.algebras.quaternion import Quaternion\n",
    "q = Quaternion(1, 2, 3, 4)\n",
    "q"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "复杂域上的四元数可以定义为:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x + x^{3} i + x j + x^{2} k$"
      ],
      "text/plain": [
       "x + x**3*i + x*j + x**2*k"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy.algebras.quaternion import Quaternion\n",
    "from sympy import symbols, I\n",
    "import pprint\n",
    "x = symbols('x')\n",
    "q1 = Quaternion(x, x**3, x, x**2, real_field = False)\n",
    "q2 = Quaternion(3 + 4*I, 2 + 5*I, 0, 7 + 8*I, real_field = False)\n",
    "q1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(3 + 4 i\\right) + \\left(2 + 5 i\\right) i + 0 j + \\left(7 + 8 i\\right) k$"
      ],
      "text/plain": [
       "(3 + 4*I) + (2 + 5*I)*i + 0*j + (7 + 8*I)*k"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 函数 add(other)\n",
    "\n",
    "添加四元数。\n",
    "\n",
    "##### 参数 other: Quaternion\n",
    "\n",
    "要添加到当前四元数的四元数。\n",
    "\n",
    "##### 返回 Quaternion\n",
    "\n",
    "将 self 添加到其他元素后的结果四元数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 6 + 8 i + 10 j + 12 k$"
      ],
      "text/plain": [
       "6 + 8*i + 10*j + 12*k"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy.algebras.quaternion import Quaternion\n",
    "from sympy import symbols\n",
    "q1 = Quaternion(1, 2, 3, 4)\n",
    "q2 = Quaternion(5, 6, 7, 8)\n",
    "q1.add(q2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 6 + 2 i + 3 j + 4 k$"
      ],
      "text/plain": [
       "6 + 2*i + 3*j + 4*k"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q1 + 5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(x + 1\\right) + 2 i + 3 j + 4 k$"
      ],
      "text/plain": [
       "(x + 1) + 2*i + 3*j + 4*k"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = symbols('x', real = True)\n",
    "q1.add(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "复杂域上的四元数:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(5 + 7 i\\right) + \\left(2 + 5 i\\right) i + 0 j + \\left(7 + 8 i\\right) k$"
      ],
      "text/plain": [
       "(5 + 7*I) + (2 + 5*I)*i + 0*j + (7 + 8*I)*k"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy.algebras.quaternion import Quaternion\n",
    "from sympy import I\n",
    "q3 = Quaternion(3 + 4*I, 2 + 5*I, 0, 7 + 8*I, real_field = False)\n",
    "q3.add(2 + 3*I)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### exp()\n",
    "\n",
    "返回 q (e ^ q)的指数。\n",
    "\n",
    "##### 返回:  Quaternion\n",
    "\n",
    "Q (e ^ q)的指数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle e \\cos{\\left(\\sqrt{29} \\right)} + \\frac{2 \\sqrt{29} e \\sin{\\left(\\sqrt{29} \\right)}}{29} i + \\frac{3 \\sqrt{29} e \\sin{\\left(\\sqrt{29} \\right)}}{29} j + \\frac{4 \\sqrt{29} e \\sin{\\left(\\sqrt{29} \\right)}}{29} k$"
      ],
      "text/plain": [
       "E*cos(sqrt(29)) + 2*sqrt(29)*E*sin(sqrt(29))/29*i + 3*sqrt(29)*E*sin(sqrt(29))/29*j + 4*sqrt(29)*E*sin(sqrt(29))/29*k"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy.algebras.quaternion import Quaternion\n",
    "q = Quaternion(1, 2, 3, 4)\n",
    "q.exp()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 方法 classmethod from_axis_angle(vector, angle)\n",
    "\n",
    "给定轴和旋转角度，返回一个四元数旋转。\n",
    "\n",
    "##### 参数 Vector: 三个数的元组`tuple`\n",
    "\n",
    "给定轴的向量表示。\n",
    "\n",
    "angle : number\n",
    "\n",
    "##### 参数 angle: number\n",
    "\n",
    "轴旋转的角度(以弧度为单位)。\n",
    "\n",
    "##### 返回 Quaternion\n",
    "\n",
    "根据给定的轴和旋转角度计算的归一化旋转四元数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{1}{2} + \\frac{1}{2} i + \\frac{1}{2} j + \\frac{1}{2} k$"
      ],
      "text/plain": [
       "1/2 + 1/2*i + 1/2*j + 1/2*k"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy.algebras.quaternion import Quaternion\n",
    "from sympy import pi, sqrt\n",
    "q = Quaternion.from_axis_angle((sqrt(3)/3, sqrt(3)/3, sqrt(3)/3), 2*pi/3)\n",
    "q"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### classmethod from_rotation_matrix(M)\n",
    "\n",
    "返回矩阵的等效四元数。四元数只有在矩阵是特殊正交的情况下才会被归一化(orthogonal and det(M) = 1)。\n",
    "\n",
    "##### 参数 M : Matrix\n",
    "\n",
    "要转换为等效四元数的输入矩阵。要对四元数进行正规化，M 必须是特殊的正交(orthogonal and det(M) = 1)。\n",
    "\n",
    "##### 返回 Quaternion\n",
    "\n",
    "给定矩阵的四元数等价。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{\\sqrt{2} \\sqrt{\\cos{\\left(x \\right)} + 1}}{2} + 0 i + 0 j + \\frac{\\sqrt{2 - 2 \\cos{\\left(x \\right)}} \\operatorname{sign}{\\left(\\sin{\\left(x \\right)} \\right)}}{2} k$"
      ],
      "text/plain": [
       "sqrt(2)*sqrt(cos(x) + 1)/2 + 0*i + 0*j + sqrt(2 - 2*cos(x))*sign(sin(x))/2*k"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy.algebras.quaternion import Quaternion\n",
    "from sympy import Matrix, symbols, cos, sin, trigsimp\n",
    "x = symbols('x')\n",
    "M = Matrix([[cos(x), -sin(x), 0], [sin(x), cos(x), 0], [0, 0, 1]])\n",
    "q = trigsimp(Quaternion.from_rotation_matrix(M))\n",
    "q"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 函数 integrate(*args)\n",
    "\n",
    "计算四元数的积分。\n",
    "\n",
    "##### 返回 Quaternion\n",
    "\n",
    "四元数(自)与给定变量的积分。\n",
    "\n",
    "四元数的不定积分:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x + 2 x i + 3 x j + 4 x k$"
      ],
      "text/plain": [
       "x + 2*x*i + 3*x*j + 4*x*k"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy.algebras.quaternion import Quaternion\n",
    "from sympy.abc import x\n",
    "q = Quaternion(1, 2, 3, 4)\n",
    "q.integrate(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 函数 inverse()\n",
    "\n",
    "返回四元数的倒数。\n",
    "\n",
    "#### 函数 mul(other)\n",
    "\n",
    "乘以四元数。\n",
    "\n",
    "##### 参数 other : 其他四元数或符号\n",
    "\n",
    "要与当前(自)四元数相乘的四元数。\n",
    "\n",
    "##### 返回 Quaternion\n",
    "\n",
    "相乘后的四元数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(-60\\right) + 12 i + 30 j + 24 k$"
      ],
      "text/plain": [
       "(-60) + 12*i + 30*j + 24*k"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy.algebras.quaternion import Quaternion\n",
    "from sympy import symbols\n",
    "q1 = Quaternion(1, 2, 3, 4)\n",
    "q2 = Quaternion(5, 6, 7, 8)\n",
    "q1.mul(q2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2 + 4 i + 6 j + 8 k$"
      ],
      "text/plain": [
       "2 + 4*i + 6*j + 8*k"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q1.mul(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x + 2 x i + 3 x j + 4 x k$"
      ],
      "text/plain": [
       "x + 2*x*i + 3*x*j + 4*x*k"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = symbols('x', real = True)\n",
    "q1.mul(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "复杂域上的四元数:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(2 + 3 i\\right) \\left(3 + 4 i\\right) + \\left(2 + 3 i\\right) \\left(2 + 5 i\\right) i + 0 j + \\left(2 + 3 i\\right) \\left(7 + 8 i\\right) k$"
      ],
      "text/plain": [
       "(2 + 3*I)*(3 + 4*I) + (2 + 3*I)*(2 + 5*I)*i + 0*j + (2 + 3*I)*(7 + 8*I)*k"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy.algebras.quaternion import Quaternion\n",
    "from sympy import I\n",
    "q3 = Quaternion(3 + 4*I, 2 + 5*I, 0, 7 + 8*I, real_field = False)\n",
    "q3.mul(2 + 3*I)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 函数 norm()\n",
    "\n",
    "返回四元数的范数。\n",
    "\n",
    "#### 函数 normalize()\n",
    "\n",
    "返回四元数的规范化形式。\n",
    "\n",
    "#### 函数 pow(p)\n",
    "\n",
    "求四元数的 p 次方。\n",
    "\n",
    "##### 参数 p : int\n",
    "\n",
    "应用于四元数的指数。\n",
    "\n",
    "##### 返回 Quaternion\n",
    "\n",
    "返回当前四元数的 p 次方。如果 p =-1，返回倒数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 668 + \\left(-224\\right) i + \\left(-336\\right) j + \\left(-448\\right) k$"
      ],
      "text/plain": [
       "668 + (-224)*i + (-336)*j + (-448)*k"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy.algebras.quaternion import Quaternion\n",
    "q = Quaternion(1, 2, 3, 4)\n",
    "q.pow(4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 函数 pow_cos_sin(p)\n",
    "\n",
    "以 cos-sin 形式计算 p 次幂。\n",
    "\n",
    "##### 参数 p : int\n",
    "\n",
    "应用于四元数的功率。\n",
    "\n",
    "##### 返回 Quaternion\n",
    "\n",
    "以 cos-sin 形式表示的 p 次幂。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 900 \\cos{\\left(4 \\operatorname{acos}{\\left(\\frac{\\sqrt{30}}{30} \\right)} \\right)} + \\frac{1800 \\sqrt{29} \\sin{\\left(4 \\operatorname{acos}{\\left(\\frac{\\sqrt{30}}{30} \\right)} \\right)}}{29} i + \\frac{2700 \\sqrt{29} \\sin{\\left(4 \\operatorname{acos}{\\left(\\frac{\\sqrt{30}}{30} \\right)} \\right)}}{29} j + \\frac{3600 \\sqrt{29} \\sin{\\left(4 \\operatorname{acos}{\\left(\\frac{\\sqrt{30}}{30} \\right)} \\right)}}{29} k$"
      ],
      "text/plain": [
       "900*cos(4*acos(sqrt(30)/30)) + 1800*sqrt(29)*sin(4*acos(sqrt(30)/30))/29*i + 2700*sqrt(29)*sin(4*acos(sqrt(30)/30))/29*j + 3600*sqrt(29)*sin(4*acos(sqrt(30)/30))/29*k"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy.algebras.quaternion import Quaternion\n",
    "q = Quaternion(1, 2, 3, 4)\n",
    "q.pow_cos_sin(4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 函数 static rotate_point(pin, r)\n",
    "\n",
    "返回旋转后的点引脚(一个3元组)的坐标。\n",
    "\n",
    "##### 参数 pin: tuple\n",
    "\n",
    "需要旋转的一个点的三元坐标元组。\n",
    "\n",
    "##### 参数 r: Quaternion 或 tuple\n",
    "\n",
    "##### 参数 R: Quaternion 或 tuple\n",
    "\n",
    "转动轴和转动角。\n",
    "\n",
    "需要注意的是，当 r 是一个元组时，它必须是形式(轴，角)\n",
    "\n",
    "##### 返回 tuple\n",
    "\n",
    "旋转后的点的坐标。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left( \\sqrt{2} \\cos{\\left(x + \\frac{\\pi}{4} \\right)}, \\  \\sqrt{2} \\sin{\\left(x + \\frac{\\pi}{4} \\right)}, \\  1\\right)$"
      ],
      "text/plain": [
       "(sqrt(2)*cos(x + pi/4), sqrt(2)*sin(x + pi/4), 1)"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy.algebras.quaternion import Quaternion\n",
    "from sympy import symbols, trigsimp, cos, sin\n",
    "x = symbols('x')\n",
    "q = Quaternion(cos(x/2), 0, 0, sin(x/2))\n",
    "trigsimp(Quaternion.rotate_point((1, 1, 1), q))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left( \\sqrt{2} \\cos{\\left(x + \\frac{\\pi}{4} \\right)}, \\  \\sqrt{2} \\sin{\\left(x + \\frac{\\pi}{4} \\right)}, \\  1\\right)$"
      ],
      "text/plain": [
       "(sqrt(2)*cos(x + pi/4), sqrt(2)*sin(x + pi/4), 1)"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(axis, angle) = q.to_axis_angle()\n",
    "trigsimp(Quaternion.rotate_point((1, 1, 1), (axis, angle)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### to_axis_angle()\n",
    "\n",
    "返回四元数的轴线和旋转角度\n",
    "\n",
    "##### 返回 tuple\n",
    "\n",
    "元组(`axis`轴， `angle`角)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(sqrt(3)/3, sqrt(3)/3, sqrt(3)/3)\n"
     ]
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{2 \\pi}{3}$"
      ],
      "text/plain": [
       "2*pi/3"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy.algebras.quaternion import Quaternion\n",
    "q = Quaternion(1, 1, 1, 1)\n",
    "(axis, angle) = q.to_axis_angle()\n",
    "print(axis)\n",
    "angle"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### to_rotation_matrix(v=None)\n",
    "\n",
    "返回四元数的等效旋转变换矩阵，它表示如果未传递 `v`，则围绕原点旋转。\n",
    "\n",
    "##### 参数 v: tuple or None\n",
    "\n",
    "元组或无\n",
    "\n",
    "默认值: None\n",
    "\n",
    "##### 返回 tuple\n",
    "\n",
    "返回四元数的等效旋转变换矩阵，它表示如果未传递 `v`，则围绕原点旋转。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\cos{\\left(x \\right)} & - \\sin{\\left(x \\right)} & 0 & \\sin{\\left(x \\right)} - \\cos{\\left(x \\right)} + 1\\\\\\sin{\\left(x \\right)} & \\cos{\\left(x \\right)} & 0 & - \\sin{\\left(x \\right)} - \\cos{\\left(x \\right)} + 1\\\\0 & 0 & 1 & 0\\\\0 & 0 & 0 & 1\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[cos(x), -sin(x), 0,  sin(x) - cos(x) + 1],\n",
       "[sin(x),  cos(x), 0, -sin(x) - cos(x) + 1],\n",
       "[     0,       0, 1,                    0],\n",
       "[     0,       0, 0,                    1]])"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy.algebras.quaternion import Quaternion\n",
    "from sympy import symbols, trigsimp, cos, sin\n",
    "x = symbols('x')\n",
    "q = Quaternion(cos(x/2), 0, 0, sin(x/2))\n",
    "trigsimp(q.to_rotation_matrix((1, 1, 1)))"
   ]
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "40d3a090f54c6569ab1632332b64b2c03c39dcf918b08424e98f38b5ae0af88f"
  },
  "kernelspec": {
   "display_name": "Python 3.8.8 ('base')",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
